﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace ControleEstoque.PDA
{
	public partial class RegistrarLeitura : UserControl
	{
		ControleEstoque.PDA.ControleEstoqueServices.ControleAtivoDataSet.MovimentacaoDataTable _movimentacoesLidas;

		public RegistrarLeitura()
		{
			InitializeComponent();

			localArmazenagemBindingSource.DataSource = Program.CurrentService.LocalArmazenagem_GetData();
		}

		private void cbLocalArmazenagemId_SelectedIndexChanged(object sender, EventArgs e)
		{
			if (cbLocalArmazenagemId.SelectedValue is int)
			{
				portalLeitorBindingSource.DataSource = Program.CurrentService.PortalLeitor_GetByLocalArmazenagemId((int)cbLocalArmazenagemId.SelectedValue);
			}
		}

		private void btnLer_Click(object sender, EventArgs e)
		{
			try
			{
				if (ValidateForm())
				{
					string movimentacaoTipo = "E";

					switch (this.dudMovimentacaoTipo.SelectedIndex)
					{
						case 0:
							movimentacaoTipo = "E";
							break;
						case 1:
							movimentacaoTipo = "R";
							break;
						case 2:
							movimentacaoTipo = "S";
							break;
					}

					_movimentacoesLidas = Program.CurrentService.Movimentacao_GetDataFromPortalLeitor((int)cbPortalLeitorId.SelectedValue, (byte)nudPortalLeitorAntena.Value, movimentacaoTipo);
					movimentacaoBindingSource.DataSource = _movimentacoesLidas;
					this.tabControl1.SelectedIndex = 1;

					CheckAtivodNotFound();
				}
			}
			catch
			{
				MessageBox.Show("Erro ao ler movimentações.", "Erro");
			}
		}

		private void CheckAtivodNotFound()
		{
			int ativoNotFound = (from ControleEstoque.PDA.ControleEstoqueServices.ControleAtivoDataSet.MovimentacaoRow row in _movimentacoesLidas.Rows where row.AtivoNotFound select row).Count<ControleEstoque.PDA.ControleEstoqueServices.ControleAtivoDataSet.MovimentacaoRow>();

			if (ativoNotFound > 0)
			{
				MessageBox.Show(string.Format("Há a necessidade de cadastrar {0} ativo(s) para registrar esta leitura.", ativoNotFound), "Informação");
			}
			else
			{
				this.btnRegistrarLeitura.Enabled = true;
			}
		}

		private bool ValidateForm()
		{
			bool isValid = true;

			if (!(cbPortalLeitorId.SelectedValue is int))
			{
				this.lblPortalLeitorId.ForeColor = Color.Red;
				isValid = false;
			}
			else
			{
				this.lblPortalLeitorId.ForeColor = SystemColors.ControlText;
			}

			return isValid;
		}

		private void btnRegistrarLeitura_Click(object sender, EventArgs e)
		{
			try
			{
				Program.CurrentService.Movimentacao_Update(_movimentacoesLidas);
				MessageBox.Show("Movimentações registradas com sucesso.", "Sucesso");
				this.btnRegistrarLeitura.Enabled = false;
			}
			catch
			{
				MessageBox.Show("Erro ao registrar movimentações.", "Erro");
			}
		}

		private void btnCadastrarAtivo_Click(object sender, EventArgs e)
		{
			FormAtivo formAtivo = new FormAtivo();

			formAtivo.ShowDialog();

			var estoqueLocalizacaoRFID = from ControleEstoque.PDA.ControleEstoqueServices.ControleAtivoDataSet.MovimentacaoRow
										 row in this._movimentacoesLidas
										 where row.AtivoNotFound
										 select row.EstoqueLocalizacaoRFID.ToString("N").Substring(0, 8);

			ControleEstoque.PDA.ControleEstoqueServices.ControleAtivoDataSet.AtivoDataTable ativo = Program.CurrentService.Ativo_GetDataByAtivoRFIDs(estoqueLocalizacaoRFID.ToArray<string>());

			var ativoNotFound = from ControleEstoque.PDA.ControleEstoqueServices.ControleAtivoDataSet.MovimentacaoRow
								row in this._movimentacoesLidas
								where row.AtivoNotFound
								select row;

			foreach (ControleEstoque.PDA.ControleEstoqueServices.ControleAtivoDataSet.MovimentacaoRow row in ativoNotFound)
			{
				ControleEstoque.PDA.ControleEstoqueServices.ControleAtivoDataSet.AtivoRow ativoFound = (from ControleEstoque.PDA.ControleEstoqueServices.ControleAtivoDataSet.AtivoRow
								 ativoRow in ativo
								 where ativoRow.AtivoRFID == row.EstoqueLocalizacaoRFID.ToString().Substring(0, 8)
								 select ativoRow).First<ControleEstoque.PDA.ControleEstoqueServices.ControleAtivoDataSet.AtivoRow>();

				row.AtivoId = ativoFound.AtivoId;
				row.AtivoNome = ativoFound.AtivoNome;
			}


			CheckAtivodNotFound();
		}

		private void dgMovimentacoes_CurrentCellChanged(object sender, EventArgs e)
		{
			dgMovimentacoes.Select(dgMovimentacoes.CurrentRowIndex);
			movimentacaoBindingSource.Position = dgMovimentacoes.CurrentRowIndex;
			this.btnCadastrarAtivo.Enabled = _movimentacoesLidas[dgMovimentacoes.CurrentRowIndex].AtivoNotFound;
		}
	}
}
